home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 1
/
Nebula One.iso
/
Misc
/
msql-1.0.6
/
src
/
common
/
strlib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-09-07
|
4KB
|
238 lines
/*
** strlib.c - "Dynamic" versions of string routines
**
**
** Copyright (c) 1993 David J. Hughes
**
** Permission to use, copy, and distribute for non-commercial purposes,
** is hereby granted without fee, providing that the above copyright
** notice appear in all copies and that both the copyright notice and this
** permission notice appear in supporting documentation.
**
** This software is provided "as is" without any expressed or implied warranty.
**
*/
#ifndef lint
static char RCSid[] =
"strlib.c,v 1.3 1994/08/19 08:02:59 bambi Exp";
#endif
#include <stdio.h>
#include <varargs.h>
#include <common/portability.h>
#define STR_LEN 4096
char strBuf[STR_LEN]; /* 4K buffer used by all d* routines */
#ifndef HAVE_STRDUP
char *strdup(s)
char *s;
{
char *s1;
if (!s)
return(NULL);
s1 = (char *)malloc(strlen(s) + 1);
if (!s1)
return(NULL);
strcpy(s1,s);
return(s1);
}
#endif
/****************************************************************************
** _dsprintf
**
** Purpose : A sprintf that handles dynamic allocation (sort of)
** Args : varargs (like printf)
** Returns : char * to newly allocated string
** Notes : This is to handle creation of queries that could be
** just about any length. Allocating one large block
** here makes more sense (and stuffs up the heap less
** than using large local arrays in each proc call.
*/
char *dsprintf(va_alist)
va_dcl
{
va_list args;
int len;
char *fmt,
*tmp;
va_start(args);
fmt = va_arg(args, char *);
(void) bzero(strBuf,STR_LEN);
(void) vsprintf(strBuf,fmt,args);
len = strlen(strBuf);
tmp = (char *)strdup(strBuf);
if (!tmp)
{
fprintf(stderr,"\ndsprintf() Out of memory\n\n");
exit(1);
}
return(tmp);
}
/****************************************************************************
** _dcsprintf
**
** Purpose : A combination dynamic sprintf and strcat
** Args : Original string
** : printf styled vararg list
** Returns : pointer to new string
** Notes : old string is freed
*/
char *dcsprintf(va_alist)
va_dcl
{
va_list args;
char *s1,
*tmp,
*fmt;
va_start(args);
s1 = va_arg(args, char *);
fmt = va_arg(args, char *);
(void)bzero(strBuf,STR_LEN);
if (s1)
{
(void)strcpy(strBuf,s1);
(void)free(s1);
}
(void) vsprintf(strBuf + strlen(strBuf),fmt,args);
tmp = (char *) strdup(strBuf);
if (!tmp)
{
fprintf(stderr,"\ndcsprintf() Out of memory\n\n" );
exit(1);
}
return(tmp);
}
char *dstrcat(s1,s2)
char *s1,
*s2;
{
char *tmp;
(void)bzero(strBuf,STR_LEN);
if (s1)
strcpy(strBuf,s1);
strcat(strBuf,s2);
tmp = (char *)strdup(strBuf);
return(tmp);
}
/****************************************************************************
** _Mstrtok
**
** Purpose : An strtok(3) that doesn't match spans of tok-sep's
** Args :
** Returns :
** Notes : This is required so that a string like "foo::" will
** return "" as the second token using Mstrtok(NULL,":");
*/
char *strtokBuf = NULL;
char *Mstrtok(str,sep)
char *str,
*sep;
{
static char *cp,
eos;
char *eot,
*tok;
if (str)
{
if (strtokBuf)
(void)free(strtokBuf);
strtokBuf = (char *)strdup(str);
cp = strtokBuf;
eos=0;
}
if (*cp == 0)
{
/*
** Force an end of string condition
*/
return(NULL);
}
eot = (char *)strpbrk(cp,sep);
if (eot)
{
tok = cp;
cp = eot + 1;
*eot = 0;
return(tok);
}
else
{
if (eos)
return(NULL);
eos = 1;
return(cp);
}
}
char *Mmalloc(length)
int length;
{
char *buf;
buf = (char *)malloc(length);
if (!buf)
{
fprintf(stderr,"\nMmalloc : Out of memory! Core dumped.\n\n");
abort();
exit(1); /* just in case SIGIOT is caught */
}
(void)bzero(buf,length);
return(buf);
}
char *Mfree(ptr)
char *ptr;
{
if (!ptr)
{
fprintf(stderr,"\nMfree : Free of NULL pointer! Core dumped.\n\n");
abort();
exit(1); /* just in case SIGIOT is caught */
}
(void)free(ptr);
return(NULL);
}